package Busquedas;


public class Nodo {
	
	private Estado estado;
	
	private boolean visitado;//Algun operador<aplicado
	
	private boolean cerrado;//todos los operadores aplicados
	
	private int valorHeuristico;
	
	private Nodo padre;
	
	private Nodo[] hijos;
	
	private int [] operadoresAplicados;
	
	private int costeAcumulado;
	
	private int numOperador;
	
	//DibujaNodos dibujaGeneral;
	
/*	
	int x;
	int y;
	
	*/
	/**
	 * Indica el n�mero de hijos que tiene actualmente
	 * (inicialmente 0)
	 */
	private int numHijos;
	
	/**
	 * El n�mero m�ximo de hijos que puede tener un nodo
	 * del �rbol
	 */
	private int numMaxHijos;
	
	public Nodo(Estado estado, int numMaxHijos, int numOperador){
		this.estado = estado;
		this.numHijos = 0;
		this.numMaxHijos = numMaxHijos;
		this.operadoresAplicados=new int [numMaxHijos];
		hijos = new Nodo[numMaxHijos];
     
		
	}

	
	public int[] getOperadoresAplicados() {
		return operadoresAplicados;
	}


	public void setOperadoresAplicados(int i) {
		this.operadoresAplicados [i]=1;
	}


	public int getNumHijos() {
		return numHijos;
	}


	public void setNumHijos(int numHijos) {
		this.numHijos = numHijos;
	}


	public int getNumMaxHijos() {
		return numMaxHijos;
	}


	public void setNumMaxHijos(int numMaxHijos) {
		this.numMaxHijos = numMaxHijos;
	}


	public boolean Visitado() {
		return visitado;
	}

	public void setVisitado(boolean visitado) {
		this.visitado = visitado;
	}

	public int getValorHeuristico() {
		return valorHeuristico;
	}

	public void setValorHeuristico(int valorHeuristico) {
		this.valorHeuristico = valorHeuristico;
	}

	public Nodo getHijos(int i) {
		return hijos[i];
	}
	
	public Nodo[] getHijos() {
		return hijos;
	}

	public void setHijos(Nodo[] hijos) {
		this.hijos = hijos;
	}

	

	public Estado getEstado() {
		return estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	public Nodo getPadre() {
		return padre;
	}

	public void setPadre(Nodo padre) {
		this.padre = padre;
	}
	
	/**
	 * A�ade un hijo al nodo actual
	 * @param operador opaerador aplicado para obtener el hijo
	 * @param estadoNuevo nuevo estado del hijo
	 * @param costeOperador coste del operador aplicado
	 * @param dibuja dibujo del nodo hijo
	 * @return nuevo nodo hijo
	 */
	public Nodo anadeHijo(int operador,Estado estadoNuevo,int costeOperador/*,DibujaNodos dibuja*/){
		if (numHijos < numMaxHijos){
			this.hijos[numHijos] = new Nodo(estadoNuevo,numMaxHijos, operador);
			

			
			this.operadoresAplicados[operador]=1;
			this.hijos[numHijos].setPadre(this);
			this.hijos[numHijos].setCosteAcumulado(this.getCosteAcumulado()+costeOperador);
			this.hijos[numHijos].numOperador= operador+1;
			//el inicial tiene 0, por eso sumamos 1
			//dibuja.anadeDibujaNodos(this,operador,new RGB(0,0,0));
			
			return this.hijos[numHijos++];
		}
		return null;
	}

	public boolean isCerrado() {
		return cerrado;
	}

	public void setCerrado(boolean cerrado) {
		this.cerrado = cerrado;
	}

	public void setOperadoresAplicados(int[] operadoresAplicados) {
		this.operadoresAplicados = operadoresAplicados;
	}

	public int getCosteAcumulado() {
		return costeAcumulado;
	}

	public void setCosteAcumulado(int costeAcumulado) {
		this.costeAcumulado = costeAcumulado;
	}

	public int getNumOperador() {
		return numOperador;
	}

	public void setNumOperador(int numOp) {
		this.numOperador = numOp;
	}


	
	
	
	
	

}
